<?php

namespace Agp\CoreBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
use Doctrine\Common\Collections\ArrayCollection;
use Agp\CoreBundle\Entity\CobrancaContrato;
use APY\DataGridBundle\Grid\Mapping as GRID;

/**
 * Agp\CoreBundle\Entity\Contrato
 *
 * @ORM\Table(name="contrato")
 * @ORM\Entity(repositoryClass="Agp\CoreBundle\Repository\ContratoRepository")
 * @ORM\HasLifecycleCallbacks
 * @GRID\Source(columns="codContrato, descricao, pessoa.nome")
 */
class Contrato
{
    /**
     * @var integer $codContrato
     *
     * @ORM\Column(name="cod_contrato", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     * @GRID\Column(title="Código", type="text", size="5", primary=true)
     */
    protected $codContrato;

    /**
     * @var \DateTime $dtInicio
     *
     * @ORM\Column(name="dt_inicio", type="date")
     * @Assert\NotBlank
     */
    protected $dtInicio;

    /**
     * @var \DateTime $dtTermino
     *
     * @ORM\Column(name="dt_termino", type="date")
     * @Assert\NotBlank
     */
    protected $dtTermino;
    
    const AL_TERMINAL = 'Aluguel de terminal';
    const ACESSO_SITE = 'Acesso ao site';
    const AL_SISTEMA = 'Aluguel de sistema';
    const SERVICO = 'Prestação de serviço';
    const VENDA_INGRESSO = 'Venda de ingresso';
    const VENDA_TERMINAL = 'Venda de terminal';
    
    /**
     * @var string $descricao
     *
     * @ORM\Column(name="descricao", type="string", length=45)
     * @Assert\NotBlank
     * @GRID\Column(title="Descrição", type="text")
     */
    protected $descricao;

    /**
     * @var \DateTime $dtAssinatura
     *
     * @ORM\Column(name="dt_assinatura", type="datetime", nullable=true)
     */
    protected $dtAssinatura;

    /**
     * @ORM\ManyToOne(targetEntity="Agp\CoreBundle\Entity\Pessoa", cascade={"persist"}, fetch="LAZY")
     * @ORM\JoinColumn(name="cod_pessoa", referencedColumnName="cod_pessoa", onDelete="restrict", nullable=false)
     * @Assert\NotBlank
     * @var object
     * 
     * @GRID\Column(field="pessoa.nome", type="text", title="Responsável")
     */
    protected $pessoa;
    
    /**
     * @ORM\ManyToOne(targetEntity="Agp\CoreBundle\Entity\Empresa", cascade={"persist"}, fetch="LAZY")
     * @ORM\JoinColumn(name="cod_empresa", referencedColumnName="cod_empresa", onDelete="restrict", nullable=false)
     * @var object
     */
    protected $empresa;
    
    /**
     * @ORM\OneToMany(targetEntity="Agp\CoreBundle\Entity\TerminalEmpresa", cascade={"persist", "merge"}, mappedBy="contrato")
     * @var arrayCollection
     */
    protected $terminais;
    
    /**
     * @ORM\OneToMany(targetEntity="Agp\CoreBundle\Entity\CobrancaContrato", cascade={"persist", "merge"}, mappedBy="contrato")
     * @ORM\OrderBy({"dtVencimento" = "ASC"})
     * @var arrayCollection
     */
    protected $cobrancasContrato;
    
    const PE_ANUAL = 'anual';
    const PE_MENSAL = 'mensal';
    const PE_DIARIO = 'diario';
    
    /**
     * @var string $periodo
     *
     * @ORM\Column(name="periodo", type="string", length=45)
     * @Assert\NotBlank
     */
    protected $periodo;
    
    /**
     * @var string $envioEmailBoleto
     *
     * @ORM\Column(name="envio_email_boleto", type="boolean")
     */
    protected $envioEmailBoleto;
    
    /**
     * @var string $liberacaoAutomatica
     *
     * @ORM\Column(name="liberacao_automatica", type="boolean")
     */
    protected $liberacaoAutomatica;

    public function __construct() {
        $this->terminais = new ArrayCollection;
        $this->cobrancasContrato = new ArrayCollection;
        $this->envioEmailBoleto = true;
        $this->liberacaoAutomatica = true;
    }
    
    public function getVlrTotal(){
        $total = 0;
        foreach ($this->cobrancasContrato as $cobranca){
            if ($cobranca->getSituacao() == CobrancaContrato::COB_BAIXADO){
                if ($cobranca->getDtVencimento() < $cobranca->getDtBaixado())
                    $total += $cobranca->getValorTotalLessAbatimento();
                else{
                    $total += $cobranca->getValorTotal();
                }
            }else{
                $total += $cobranca->getValorTotal();
            }
        }
        
        return $total;
    }
    
    public function __toString(){
        return $this->getDescricao().' - '.$this->getCodContrato();
    }

    /**
     * @Assert\True(message = "Data de início maior que de término")
     */
    public function isDateLegal()
    {
        if ($this->dtInicio > $this->dtTermino){
            return false;
        }
        
    }
    
    // RETORNA O COD DA ÚLTIMA COBRANÇA
    public function getLastCodCobranca(){
        $cobrancas = array();
        foreach ($this->getCobrancasContrato() as $cobranca){
              $cobrancas[] = $cobranca;
        }
        
        return end($cobrancas)->getCodCobrancaContrato();
    }
    
    // RETORNA O COD DA ÚLTIMA COBRANÇA DO TIPO cobranca_regular
    public function getLastCodCobrancaByRegular(){
        $cobrancas = array();
        foreach ($this->getCobrancasContrato() as $cobranca){
              if ($cobranca->getTipo() == CobrancaContrato::TP_COBRANCA){
                 $cobrancas[] = $cobranca; 
              }
              
        }
        
        return end($cobrancas)->getCodCobrancaContrato();
    }
    
    public function getCobrancasRegulares()
    {
        $cobrancas = new ArrayCollection;
        foreach ($this->getCobrancasContrato() as $cobranca){
           if ($cobranca->getTipo() == CobrancaContrato::TP_COBRANCA){
              $cobrancas->add($cobranca);
           }
        }
        
        return $cobrancas;
    }
    
    public function getCobrancasVendas()
    {
        $cobrancas = new ArrayCollection;
        foreach ($this->getCobrancasContrato() as $cobranca){
           if ($cobranca->getTipo() == CobrancaContrato::TP_VENDA){
              $cobrancas->add($cobranca);
           }
        }
        
        return $cobrancas;
    }

    /**
     * Get codContrato
     *
     * @return integer 
     */
    public function getCodContrato()
    {
        return $this->codContrato;
    }

    /**
     * Set dtInicio
     *
     * @param \DateTime $dtInicio
     * @return Contrato
     */
    public function setDtInicio($dtInicio)
    {
        $this->dtInicio = $dtInicio;
    
        return $this;
    }

    /**
     * Get dtInicio
     *
     * @return \DateTime 
     */
    public function getDtInicio()
    {
        return $this->dtInicio;
    }

    /**
     * Set dtTermino
     *
     * @param \DateTime $dtTermino
     * @return Contrato
     */
    public function setDtTermino($dtTermino)
    {
        $this->dtTermino = $dtTermino;
    
        return $this;
    }

    /**
     * Get dtTermino
     *
     * @return \DateTime 
     */
    public function getDtTermino()
    {
        return $this->dtTermino;
    }

    /**
     * Set dtAssinatura
     *
     * @param \DateTime $dtAssinatura
     * @return Contrato
     */
    public function setDtAssinatura($dtAssinatura)
    {
        $this->dtAssinatura = $dtAssinatura;
    
        return $this;
    }

    /**
     * Get dtAssinatura
     *
     * @return \DateTime 
     */
    public function getDtAssinatura()
    {
        return $this->dtAssinatura;
    }

    public function setPessoa($pessoa) {
        $this->pessoa = $pessoa;
    }
    
    public function getPessoa() {
        return $this->pessoa;
    }

    public function setEmpresa($empresa) {
        $this->empresa = $empresa;
    }
    
    public function getEmpresa() {
        return $this->empresa;
    }

    /**
     * Get terminais
     *
     * @return Doctrine\Common\Collections\Collection 
     */
    public function getTerminais()
    {
        return $this->terminais;
    }
    
    /**
     * Set terminais
     *
     * @return Doctrine\Common\Collections\Collection 
     */
    public function setTerminais($terminais)
    {
        foreach ($terminais as $terminal){
            $terminal->setContrato($this);
        }
        
        $this->terminais = $terminais;
    }
    
    public function getDescricao() {
        return $this->descricao;
    }

    public function setDescricao($descricao) {
        $this->descricao = $descricao;
    }

        
    public function getCobrancasContrato() {
        return $this->cobrancasContrato;
    }
    
    public function getCobrancaContratoRegular() {
        foreach ($this->cobrancasContrato as $cobranca){
            if ($cobranca->getTipo() == CobrancaContrato::TP_COBRANCA && $cobranca->getSituacao() == CobrancaContrato::COB_ABERTO || $cobranca->getSituacao() == CobrancaContrato::COB_VISUALIZADO){
                return $cobranca;
            }else{
                false;
            }
        }
    }
    
    public function getCobrancaContratoVenda() {
        foreach ($this->cobrancasContrato as $cobranca){
            if ($cobranca->getTipo() == CobrancaContrato::TP_VENDA && $cobranca->getSituacao() == CobrancaContrato::COB_ABERTO || $cobranca->getSituacao() == CobrancaContrato::COB_VISUALIZADO){
                return $cobranca;
            }else{
                false;
            }
        }
    }

    public function addCobrancasContrato($cobrancaContrato) {
        $this->cobrancasContrato[] = $cobrancaContrato;
    }
    
    public function getPeriodo() {
        return $this->periodo;
    }

    public function setPeriodo($periodo) {
        $this->periodo = $periodo;
    }
    
    public function getEnvioEmailBoleto() {
        return $this->envioEmailBoleto;
    }

    public function setEnvioEmailBoleto($envioEmailBoleto) {
        $this->envioEmailBoleto = $envioEmailBoleto;
    }
  
    public static function getPeriodoList(){
        return array(self::PE_ANUAL => ucfirst(self::PE_ANUAL),
                     self::PE_MENSAL => ucfirst(self::PE_MENSAL),
                     self::PE_DIARIO => ucfirst(self::PE_DIARIO));
    } 
    
    public static function getDescricaoList(){
        return array(self::AL_TERMINAL => self::AL_TERMINAL,
                     self::ACESSO_SITE => self::ACESSO_SITE,
                     self::SERVICO => self::SERVICO,
                     self::AL_SISTEMA => self::AL_SISTEMA,
                     self::VENDA_INGRESSO => self::VENDA_INGRESSO,
                     self::VENDA_TERMINAL => self::VENDA_TERMINAL
                     );
    }
    
    public function getLiberacaoAutomatica() {
        return $this->liberacaoAutomatica;
    }

    public function setLiberacaoAutomatica($liberacaoAutomatica) {
        $this->liberacaoAutomatica = $liberacaoAutomatica;
    }
    
}
